/**
* File: War3Source_901_Robol.sp
* Description: Dunno.
* Author(s): MleKo
*/
#pragma semicolon 1
#include <cstrike>
#include <sourcemod>
#include <sdkhooks>
#include <sdktools_tempents>
#include <sdktools_functions>
#include <sdktools_tempents_stocks>
#include <sdktools_entinput>
#include <sdktools_sound>
#include "W3SIncs/War3Source_Interface"
#include "revantools.inc"


//====== Skroty Dla Skili
new thisRaceID, SKILL_1,SKILL_2,SKILL_3,ULT_4;
//====== Skill_1
new Float:Buciki[5]={1.0,0.85,0.7,0.6,0.5};
new Float:SzybkieBuciki[5]={1.0,1.05,1.1,1.15,1.2};
//====== Skill 2
new Float:SilaRekawiczek[5] = { 0.0, 0.5, 1.0, 1.5, 2.0 };
//====== Skill 3
new Float: ReuseKlocka[5]={0.0,15.0,12.0,9.0,6.0}; 		// Czas do Ponownego utworzenia Klocka
new HpKlocka[5]={0,100,200,300,400};						// Ilosc Zycia Klocka zaleznie od LVLu Skila 3
new Robol[MAXPLAYERS];									//Index Dla pozycji Gracza
new Float:MiejsceRobola[MAXPLAYERS][3];					//Index Dla pozycji nowego klocka
new String:MlotekSound[]="war3source/robol/mlotek.wav";
//====== Skill 4
new Float: ReusemultiKlocka[5]={0.0,30.0,25.0,20.0,15.0}; 	// Czas do Ponownego utworzenia Klocka
new HpmultiKlocka[5]={0,30,60,90,120};						// Ilosc Zycia Klocka zaleznie od LVLu Skila 3
// new RadiusKlocka[5]={0,50,60,90,120};						//Zasieg Wybuchu multiKlocka
// new DamageKlocka[5]={0,15,30,45,60};						//Obrazenia zadane przez wybuch multiKlocka
//====== Index Klockow
#define MAXKLOCKI 1024 									// Ile klockow maksymalnie moze postawic
new iloscKlockow[MAXPLAYERS]; 							// Tablica zawierajaca ilosc klockow postawionych przez gracza
new wlascicielKlocka[MAXPLAYERS][MAXKLOCKI]; 				// Tablica zawierajaca id klockow postawionych przez danego gracza


public Plugin:myinfo = 
	{
	name = "Polski Budowniczy",
	author = "MleKo",
	description = "We Will See.",
	version = "1.0.1",
	url = ""
	};

public OnWar3PluginReady()
{
	thisRaceID = War3_CreateNewRace( "Polski Budowniczy", "klocek" );
	SKILL_1 = War3_AddRaceSkill( thisRaceID, "Buty Robotnika", "Szefo zafundował Ci wspaniałe buty, Ty tylko musisz nauczyć się ich używać.", false );
	SKILL_2 = War3_AddRaceSkill( thisRaceID, "Super Rękawice", "Rękawice ktore wraz ze wzrostem lvlu pomogą Ci zadać większe obrażenia przeciwnikowi", false );
	SKILL_3 = War3_AddRaceSkill( thisRaceID, "Cieśla", "Po latach pracy uczysz się nareszcie budowy betonowych Konstrukcji! (+ability)", false );
	ULT_4 = War3_AddRaceSkill( thisRaceID, "Super Cieśla", "(+ultimate)", true );
	W3SkillCooldownOnSpawn( thisRaceID, ULT_4, 15.0, _);
	W3SkillCooldownOnSpawn( thisRaceID, SKILL_3, 10.0, _);
	War3_CreateRaceEnd( thisRaceID );
}

public OnMapStart()												//Start Mapy
{
	PrecacheModel( "models/props/de_nuke/cinderblock_stack.mdl" );	//Tworzymy polecenie Cache dla dodatkowych modeli
	War3_PrecacheSound(MlotekSound);									//Tworzymy polecenie Cache dla dodatkowych dzwiekow
	AddFileToDownloadsTable("sound/war3source/robol/mlotek.wav");
}

public OnPluginStart()											//Start Pluginu/Rasy
{
}

public OnWar3EventSpawn(client)									//[Wydarzenie] Zrespienie sie gracza
{
	new race=War3_GetRace(client);									//Okreslanie slowa [race]
	if(race==thisRaceID)											//Pytanie Czy Rasa jest odpowiednia
	{															//Tak :
		InitPassiveSkills(client);										//Uruchom Skile Pasywne
	}
}

public OnSkillLevelChanged(client,race,skill,newskilllevel)				//Jezeli Zmienimy Skile to:
{
	InitPassiveSkills(client);											//Uruchom Skile Pasywne
}

public InitPassiveSkills(client)										//Skile Pasywne
{
	if(War3_GetRace(client)==thisRaceID)								//Weryfikacja czy Gracz jest Rasa ktora byc powinien
	{		
		new skill_buciki=War3_GetSkillLevel(client,thisRaceID,SKILL_1);		//Ustalamy LVL Skila nr 3
		new Float:gravity=Buciki[skill_buciki];						//Pobieranie Wartosci "fLowGravitySkill" wzgledem Skila nr3
		new Float:szybciutko=SzybkieBuciki[skill_buciki];				//Pobieranie Wartosci "fMaxSpeed" wzgledem Skila nr3
		War3_SetBuff(client,fLowGravitySkill,thisRaceID,gravity);			//Grawitacja
		War3_SetBuff(client,fMaxSpeed,thisRaceID,szybciutko);			//Bieganie
	}
}

public OnRaceChanged(client,oldrace,newrace)						//Gdy Gracz zmieni Rase to:
{
	if(newrace!=thisRaceID)										//Pytanie czy Rasa jest inna niz powinna
	{															//TAK - jest inna wiec:
		War3_SetBuff(client, fLowGravitySkill, thisRaceID, 1.0);			//Przywracanie domyslnych wartosci [fLowGravitySkill]
		War3_SetBuff(client, fMaxSpeed, thisRaceID, 1.0);				//Przywracanie domyslnych wartosci [fMaxSpeed]
	}
	else														//Jest odpowienia
	{	
		if(IsPlayerAlive(client))									//Jezeli gracz Zyje?:
		{
			InitPassiveSkills(client);									//Skile Pasywne
			
		}	
	}
}

public OnWar3EventPostHurt( victim, attacker, damage )
{
	if( W3GetDamageIsBullet() && ValidPlayer( victim, true ) && ValidPlayer( attacker, true ) && GetClientTeam( victim ) != GetClientTeam( attacker ) )
	{
		if( War3_GetRace( attacker ) == thisRaceID )
		{
			new skill_raczki = War3_GetSkillLevel( attacker, thisRaceID, SKILL_2 );
			if( !Hexed( attacker, false ) && GetRandomFloat( 0.0, 1.0 ) <= 0.15 )
			{
				if( !W3HasImmunity( victim, Immunity_Skills ) )
				{
					War3_DealDamage( victim, RoundToFloor( damage * SilaRekawiczek[skill_raczki] ), attacker, DMG_BULLET, "" );

				}
			}
		}
	}
}	

public OnAbilityCommand( client, ability, bool:pressed )	// URUCHAMIANIE ABILITY
{
	if( War3_GetRace( client ) == thisRaceID && ability == 0 && pressed && IsPlayerAlive( client ) && !Silenced(client) )
	{
		new skill_klocki = War3_GetSkillLevel( client, thisRaceID, SKILL_3 );
		if( skill_klocki > 0 )
		{
			if( !Silenced( client ) && War3_SkillNotInCooldown(client,thisRaceID,SKILL_3,true) )
			{
				CreateBlock(client);
			}
			
		}
	}
}

public CreateBlock(client)	//ABILITY
{
	if(War3_GetRace(client)==thisRaceID)
	{
		new skill_block=War3_GetSkillLevel(client,thisRaceID,SKILL_3);
		if(skill_block>0)
		{
			Robol[client]=client;
			War3_GetAimTraceMaxLen(client,MiejsceRobola[client],150.0);
			new klocek = CreateEntityByName("prop_physics_override");
			if (klocek > 0 && IsValidEdict(klocek))
			{
				new robotnik = GetClientTeam(client);
				decl String:entname[16];
				Format(entname, sizeof(entname), "klocek%i_block%i",client,klocek);
				SetEntityModel(klocek, "models/props/de_nuke/cinderblock_stack.mdl");	
				ActivateEntity(klocek);
				DispatchKeyValue(klocek, "StartDisabled", "false");
				DispatchKeyValue(klocek, "targetname", entname);
				DispatchSpawn(klocek);				
				DispatchKeyValue(klocek, "disablereceiveshadows", "1");
				DispatchKeyValue(klocek, "disableshadows", "1");																	
				SetEntProp(klocek, Prop_Data, "m_nSolidType", 6);
				SetEntProp(klocek, Prop_Data, "m_CollisionGroup", 6);
				SetEntProp(klocek, Prop_Data, "m_usSolidFlags", 5);				
				SetEntityMoveType(klocek, MOVETYPE_NONE);
				SetEntProp(klocek, Prop_Data, "m_takedamage", 2);
				SetEntProp(klocek, Prop_Data, "m_iHealth", HpKlocka[skill_block]);
				SetEntityFlags(klocek, 18);
				if(robotnik==3) 
				{
					SetEntityRenderColor(klocek, 105, 105, 190, 10);		// CT
				}
				else 
				{
					SetEntityRenderColor(klocek, 180, 105, 105, 10);		// T
				}				
				AcceptEntityInput(klocek, "DisableMotion");
				TeleportEntity(klocek, MiejsceRobola[client], NULL_VECTOR, NULL_VECTOR);
				
				War3_CooldownMGR( client, ReuseKlocka[skill_block], thisRaceID, SKILL_3, true, true );
				wlascicielKlocka[client][iloscKlockow[client]] = klocek; // przypisz id klocka do tablicy
				iloscKlockow[client]++; // zwieksz ilosc klockow postawionych przez gracza
				EmitSoundToAll(MlotekSound,client);
			}
		}
	}
}

public OnUltimateCommand( client, ultimate, bool:pressed )	//URUCHAMIANIE ULTIMATE
{
	if(pressed)
	{
		if( War3_GetRace( client ) == thisRaceID && IsPlayerAlive( client ) )
		{
			new skill_multiklocki = War3_GetSkillLevel( client, thisRaceID, ULT_4 );
			if( skill_multiklocki > 0 )
			{
				if( !Silenced( client ) && War3_SkillNotInCooldown(client,thisRaceID,ULT_4,true) )
				CreateUberBlock(client);		
			}
		}
	}
}

public CreateUberBlock(client)	//ULTIMATE
{
	if(War3_GetRace(client)==thisRaceID && IsPlayerAlive( client ))
		{
		new skill_multi=War3_GetSkillLevel(client,thisRaceID,ULT_4);
		if(skill_multi>0)
		{
			Robol[client]=client;
			War3_GetAimTraceMaxLen(client,MiejsceRobola[client],150.0);
			new klocek = CreateEntityByName("prop_physics_override");
			if (klocek > 0 && IsValidEdict(klocek))
			{
				new robotnik = GetClientTeam(client);
				decl String:entname[16];
				Format(entname, sizeof(entname), "klocek%i_block%i",client,klocek);
				SetEntityModel(klocek, "models/props/de_nuke/cinderblock_stack.mdl");	
				ActivateEntity(klocek);
				DispatchKeyValue(klocek, "StartDisabled", "false");
				DispatchKeyValue(klocek, "targetname", entname);
				DispatchSpawn(klocek);				
				DispatchKeyValue(klocek, "disablereceiveshadows", "1");
				DispatchKeyValue(klocek, "disableshadows", "1");																	
				SetEntProp(klocek, Prop_Data, "m_nSolidType", 6);
				SetEntProp(klocek, Prop_Data, "m_CollisionGroup", 6);
				SetEntProp(klocek, Prop_Data, "m_usSolidFlags", 5);				
				SetEntityMoveType(klocek, MOVETYPE_NONE);
				SetEntProp(klocek, Prop_Data, "m_takedamage", 2);
				SetEntProp(klocek, Prop_Data, "m_iHealth", HpmultiKlocka[skill_multi]);
				SetEntityFlags(klocek, 18);
				if(robotnik==3) 
				{
					SetEntityRenderColor(klocek, 255, 200, 0, 1);		// CT
				}
				else 
				{
					SetEntityRenderColor(klocek, 255, 200, 0, 1);		// T
				}				
				AcceptEntityInput(klocek, "DisableMotion");
				TeleportEntity(klocek, MiejsceRobola[client], NULL_VECTOR, NULL_VECTOR);
				
				War3_CooldownMGR( client, ReusemultiKlocka[skill_multi], thisRaceID, ULT_4, true, true );
				wlascicielKlocka[client][iloscKlockow[client]] = klocek;
				iloscKlockow[client]++;
				if (skill_multi == 1)
				{
					DispatchKeyValue(klocek, "ExplodeRadius", "50" );
					DispatchKeyValue(klocek, "ExplodeDamage", "45" );
				}
				else if (skill_multi == 2)
				{
					DispatchKeyValue(klocek, "ExplodeRadius", "70" );
					DispatchKeyValue(klocek, "ExplodeDamage", "50" );
				}
				else if (skill_multi == 3)
				{
					DispatchKeyValue(klocek, "ExplodeRadius", "90" );
					DispatchKeyValue(klocek, "ExplodeDamage", "75" );
				}
				else if (skill_multi == 4)
				{
					DispatchKeyValue(klocek, "ExplodeRadius", "120" );
					DispatchKeyValue(klocek, "ExplodeDamage", "100" );
				}				
			}
		}
	}
}

public OnWar3EventDeath( client )
{
	if( War3_GetRace( client ) == thisRaceID )
	{
		usunKlocki( client );
	}
}

public usunKlocki( client )
{
	new ilosc = iloscKlockow[client];
	
	for(new i = 0; i < ilosc; i++) 
	{
		if(IsValidEntity(wlascicielKlocka[client][i]))
		{
			//SetEntProp(wlascicielKlocka[client][i], Prop_Data, "m_iHealth", 1);
			AcceptEntityInput(wlascicielKlocka[client][i], "Kill");
		}
		wlascicielKlocka[client][i] = 0;
		iloscKlockow[client]--;
	}
}